package com.exam.util;

import com.exam.pojo.Question;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @author: 黄星
 * YellowStar所写的对题目操作的工具类
 */
public class QuestionUtils {

	/**判断下标是否出现过
	 * @param index:随机生成的下标
	 * @param indexs:已经存在的下标
	 * @return 已存在返回true, 不存在返回false
	 */
	public static Boolean HasApperedIndex(int index, List<Integer> indexs) {

		Boolean ret = false;  // 返回值，默认不存在

		for (int i = 0; i < indexs.size(); i++) {
			if (index == indexs.get( i )) {
				//如果相等，即存在，就返回true
				ret = true;
				break;
			}
		}
		return ret;

	}

	/**选择题随机答案
	 * @param answer 正确答案；
	 * @param errAnswer 错误答案；
	 * @return 答案列表
	 * */
	public static List<String> randomAnswer(String answer,String errAnswer){

		List<String> ret = new ArrayList<String>(  );   //用于返回生成的随机答案序列
		Random random = new Random(  );
		String[] errAnswers = errAnswer.split( "~" );   //将错误答案拆分
		List<String> randomList = new ArrayList<String>(  );   //临时存储
		List<Integer> indexs = new ArrayList<Integer>(  );     //下标存储

		//先将所有的答案放入一个List中  再对该list进行随机
		randomList.add( answer );
		for(int i = 0 ;i < errAnswers.length;i++){
			randomList.add( errAnswers[i] );
		}

		for(int i = 0;i < randomList.size();i++){
			int bigNumber = random.nextInt( 123456 );   //先随机大数，减少重复性
			int smallNumber = random.nextInt( bigNumber );     //再次随机，减少重复性
			int index = random.nextInt( smallNumber ) % 4;     //生成0,1,2,3   对应下标，添加到返回列表
			while (HasApperedIndex(index,indexs)){
				index = random.nextInt( smallNumber ) % 4;
			}
			ret.add( randomList.get( index ) );
			indexs.add( index );
		}

		return ret;

	}

	/**填空题划分题目
	 * @param topic 要划分的题目；
	 * @return 划分结果
	 * */
	public static List<String> splitTopic(String topic){

		List<String> ret = new ArrayList<String>(  );
		String[] topics = topic.split( "_" );
		for(int i = 0;i < topics.length;i++){
			ret.add( topics[i] );  //将答案存入要返回的list中
		}
		if(topics.length == 1){   //如果下划线在最后，split长度就1  得添一个空串
			ret.add( "" );
		}
		return ret;
	}

	/**计算选择题分数
	 * @param choice 选择的项
	 * @param question 选择题的问题，用来获取正确答案
	 * @param answers 随机的答案列表，用来判断是否选择正确
	 * @return 获得的分数
	 * */
	public static int computeChoiceScore(int choice, Question question,List<String> answers){

		int score = 0;
		if(answers.get( choice - 1 ).trim().equals( question.getAnswer() )){
			score = PropertiesUtil.getQuestionScore( "choice" );
		}
		return score;

	}

	/** 计算填空题答案
	 * @param inputAnswer 选择的项
	 * @param question 填空题的问题，用来获取正确答案
	* @return    获得的分数
	 * */
	public static int computeBlankScore(String inputAnswer,Question question){

		int score = 0;
		if(question.getAnswer().trim().equals( inputAnswer.trim() )){
			score = PropertiesUtil.getQuestionScore( "blank" );
		}
		return score;
	}

	/**计算判断题答案
	 * @param choice 选择的是对还是错
	 * @param question    选择的问题，用来获取正确答案
	 * @return    获得的分数
	 * */
	public static int computeJudgeScore(String choice,Question question){

		int score = 0;
		if(question.getAnswer().trim().equals( "对" )){
			//问题显示的是正确题目，则答案要选对
			if(choice.trim().equals( "yes" )){
				//yes 就是对的
				score = PropertiesUtil.getQuestionScore( "judge" );
			}

		}else {
			//问题显示的是错误题目，则答案要选错
			if(choice.trim().equals( "no" )){
				//no 就是对的
				score = PropertiesUtil.getQuestionScore( "judge" );
			}

		}
		return score;

	}
}
